home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / docs / ippon / data / etc / lboss03.lzh / enemy.c next >
C/C++ Source or Header  |  1999-04-30  |  11KB  |  522 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <XSP2lib.H>
  5. #include "main.h"
  6. #include "enemy.h"
  7. #include "fxsp2lib.h"
  8. #include "parts.h"
  9.  
  10. #define ENEMY_MAX    256    /* 最大数 */
  11.  
  12.  
  13. #define P1_K    0.5        /* ばね定数(左右大パーツ) */
  14. #define P1_M    0.2        /* 摩擦計数(左右大パーツ) */
  15. #define P1_V    0.5        /* 速度がこれ以下なら次へ(左右大パーツ) */
  16. #define P1_L    0.4        /* 座標がこれ以下なら次へ(左右大パーツ) */
  17.  
  18. /* 2段階目大パーツ合体時 */
  19. #define P3_K    1.5        /* ばね定数 */
  20. #define P3_M    0.10        /* 摩擦計数 */
  21. #define P3_V    0.8        /* 速度がこれ以下なら次へ */
  22. #define P3_L    0.8        /* 座標がこれ以下なら次へ */
  23.  
  24. /* 2段階目左右翼パーツ */
  25. #define P5_K    1.6        /* ばね定数(左右上小パーツ) */
  26. #define P5_M    0.12        /* 摩擦計数(左右上小パーツ) */
  27. #define P5_V    0.1        /* 速度がこれ以下なら次へ(左右上小パーツ) */
  28. #define P5_L    0.1        /* 座標がこれ以下なら次へ(左右上小パーツ) */
  29.  
  30. /* 2段階目左右耳パーツ */
  31. #define P7_K    3.0        /* ばね定数(左右上小パーツ) */
  32. #define P7_M    0.02        /* 摩擦計数(左右上小パーツ) */
  33. #define P7_V    0.1        /* 速度がこれ以下なら次へ(左右上小パーツ) */
  34. #define P7_L    0.1        /* 座標がこれ以下なら次へ(左右上小パーツ) */
  35.  
  36.  
  37. static ENEMY *enemy_top,    /* 使用中のワークのリスト */
  38.  *enemy_null_top,        /* 空のワークのリスト */
  39.  *enemy_end;            /* 使用中ワークのリストの末尾 */
  40.  
  41. static ENEMY enemy[ENEMY_MAX];    /* ワーク */
  42.  
  43. extern char end_of_data;
  44. extern char f_option_flag;
  45.  
  46. typedef struct _spwork {
  47.     signed short x, y;    /* 座標 */
  48.     unsigned short pt;    /* スプライトパターンNo. */
  49.     unsigned short info;    /* 反転コード・色・優先度を表わすデータ */
  50. } SPWORK;
  51.  
  52.  
  53. SPWORK spwork;
  54.  
  55. FILE *fp_parts1;
  56.  
  57.  
  58. int EnemyInit0 (void)
  59. {
  60.     int i;
  61.  
  62.     /* リストをつなげる */
  63.     enemy_top = NULL;
  64.     enemy_end = NULL;
  65.     enemy_null_top = enemy;
  66.     for (i = 0; i < ENEMY_MAX; i++)
  67.         enemy[i].next = &enemy[i + 1];
  68.  
  69.     enemy[ENEMY_MAX - 1].next = NULL;
  70.  
  71.     return (0);
  72. }
  73.  
  74.  
  75.  
  76. void EnemyInit (unsigned short type, unsigned short info,
  77.         signed short ox, signed short oy, ENEMY * parent)
  78. {
  79.     ENEMY *p;
  80.  
  81.     if (enemy_null_top == NULL) {
  82.         printf ("ワークが一杯です\n");
  83.         return;        /* 空きのワークがない(キャラクターオーバー) */
  84.     }
  85.     /* リストの末尾に新しいノードを追加 */
  86.     p = enemy_null_top;
  87.     enemy_null_top = p->next;
  88.     if (enemy_top == NULL)
  89.         enemy_top = p;
  90.     else
  91.         enemy_end->next = p;
  92.     p->next = NULL;
  93.     enemy_end = p;
  94.  
  95.     p->type = type;
  96.     p->info = info;
  97.     p->ox = ox;
  98.     p->oy = oy;
  99.     p->x = 0;
  100.     p->y = 0;
  101.     p->parent = parent;
  102.  
  103.     p->lx = 0.0;
  104.     p->ly = 0.0;
  105.     p->lz = 0.0;
  106.     p->vx = 0.0;
  107.     p->vy = 0.0;
  108.     p->vz = 0.0;
  109.     p->cyc = 0;
  110.     p->cyc1 = 0;
  111.  
  112.     switch (p->type) {
  113.     case 1:
  114.         p->lz = 1.0;    /* 始点が 0.0, 終点が 1.0 */
  115.         p->vz = 1.0;
  116.         if (f_option_flag)
  117.             fp_parts1 = fopen ("parts1.doc", "w");
  118.         switch (p->ox) {
  119.         case 0:
  120.             p->ox = -32;
  121.             p->oy = -32;
  122.             break;
  123.         case 1:
  124.             p->ox = 32;
  125.             p->oy = -32;
  126.             break;
  127.         case 2:
  128.             p->ox = -32;
  129.             p->oy = 32;
  130.             break;
  131.         case 3:
  132.             p->ox = 32;
  133.             p->oy = 32;
  134.             break;
  135.         }
  136.         break;
  137. #if     0
  138.     case 3:        /* 2段階目大パーツ */
  139.         if (f_option_flag)
  140.             fp_parts3 = fopen ("parts3.doc", "w");
  141.         p->ly = 192.0;
  142.         p->vy = -6.4;
  143.         break;
  144.     case 5:
  145.         if (f_option_flag)
  146.             fp_parts5 = fopen ("parts5.doc", "w");
  147.         break;
  148.     case 6:
  149.         if (f_option_flag)
  150.             fp_parts6 = fopen ("parts6.doc", "w");
  151.         break;
  152.     case 7:
  153.         if (f_option_flag)
  154.             fp_parts7 = fopen ("parts7.doc", "w");
  155.         break;
  156.     case 8:
  157.         if (f_option_flag)
  158.             fp_parts8 = fopen ("parts8.doc", "w");
  159.         break;
  160. #endif
  161.     default:
  162.         break;
  163.     }
  164. }
  165.  
  166.  
  167. /* 複数のスプライトで構成されているパーツ1個分のスプライトをまとめて表示 */
  168. static void DispSp (ENEMY * p, short sp_num, PARTS_TABLE * parts_table)
  169. {
  170.     short h;
  171.  
  172.     for (h = 0; h < sp_num; h++) {
  173.         p->x = p->lx + p->ox;
  174.         p->y = p->ly + p->oy;
  175.         if (p->parent != NULL) {
  176.             spwork.x = p->x + p->parent->x + parts_table[h].x;
  177.             spwork.y = p->y + p->parent->y + parts_table[h].y;
  178.         } else {
  179.             spwork.x = p->x + parts_table[h].x;
  180.             spwork.y = p->y + parts_table[h].y;
  181.         }
  182.         spwork.pt = parts_table[h].pt;
  183.         spwork.info = p->info;
  184.  
  185.         spwork.x += (128 + 16);    /* 表示用に補正 */
  186.         spwork.y += (128 + 16);
  187.         xsp_set_st (&spwork);
  188.         fxsp_set_st (&spwork);
  189.         spwork.x -= (128 + 16);
  190.         spwork.y -= (128 + 16);
  191.     }
  192. }
  193.  
  194.  
  195.  
  196. void EnemyMove (void)
  197. {
  198.     ENEMY *p, *q;
  199.  
  200.     p = enemy_top;
  201.     q = NULL;
  202.     while (p != NULL) {
  203.         char erase_flag = 0;
  204.  
  205.         switch (p->type) {
  206.         case 0:    /* 本体 */
  207.             DispSp (p, 64, parts0_table);
  208. //            erase_flag = !0;
  209.             break;
  210.         case 1:    /* パーツ */
  211.             switch (p->cyc) {
  212.             case 0:    /* ばね振動 */
  213.                 p->vz -= p->lz * P5_K;
  214.                 /* 摩擦 */
  215.                 if (p->vz > 0)
  216.                     p->vz -= P5_M;
  217.                 else
  218.                     p->vz += P5_M;
  219.                 p->lz += p->vz;
  220.                 p->lx = p->ox/32.0 * p->lz;
  221.                 p->ly = p->oy/32.0 * p->lz;
  222.                 if ((fabs (p->vz) < P5_V) && (fabs (p->lz) < P5_L)) {
  223.                     p->cyc++;    /* 次へ */
  224.                     p->lx = 0.0;
  225.                     p->ly = 0.0;
  226.                     p->vx = 0.0;
  227.                     p->vy = 0.0;
  228.                     end_of_data = !0;    /* debug */
  229.                 }
  230.                 break;
  231.             default:
  232.                 break;
  233.             }
  234.             if (f_option_flag)
  235.                 fprintf (fp_parts1, "{%d,%d}, ", (int) (p->lx + p->ox), (int) (p->ly + p->oy));
  236.             DispSp (p, 25, parts1_table);
  237. //            erase_flag = !0;
  238.             break;
  239. #if    0
  240.         case 2:    /* 1段階目で分離した頭 */
  241.             DispSp (p, 30, parts2_table);
  242.             erase_flag = !0;
  243.             break;
  244.  
  245.         case 3:    /* 2段階目大パーツ */
  246.             switch (p->cyc) {
  247.             case 0:
  248.                 p->ly += p->vy;
  249.                 if (p->ly < 32.0)
  250.                     p->cyc++;
  251.                 break;
  252.             case 1:
  253.                 if ((p->ly > 1.0) && (p->vy < -1.2))
  254.                     p->vy += 0.8;
  255.                 p->ly += p->vy;
  256.                 if (p->ly < 1.0)
  257.                     p->cyc++;
  258.                 break;
  259.             case 2:/* ばね振動 */
  260.                 p->vy -= p->ly * P3_K;
  261.                 /* 摩擦 */
  262.                 if (p->vy > 0)
  263.                     p->vy -= P3_M;
  264.                 else
  265.                     p->vy += P3_M;
  266.                 p->ly += p->vy;
  267.                 if ((fabs (p->vy) < P3_V) && (fabs (p->ly) < P3_L)) {
  268.                     p->cyc++;    /* 次へ */
  269.                     p->lx = 0.0;
  270.                     p->ly = 0.0;
  271.                     p->vx = 0.0;
  272.                     p->vy = 0.0;
  273.                 }
  274.                 break;
  275.             case 3:
  276.                 erase_flag = !0;
  277.                 break;
  278.             default:
  279.                 break;
  280.             }
  281.             if (f_option_flag)
  282.                 fprintf (fp_parts3, "{%d,%d}, ", (int) (p->lx + p->ox), (int) (p->ly + p->oy));
  283.             DispSp (p, 60, parts3_table);
  284.             break;
  285.  
  286.         case 4:    /* 2段階目本体 */
  287.             DispSp (p, 90, parts4_table);
  288.             break;
  289.  
  290.         case 5:    /* 左翼パーツ */
  291.             switch (p->cyc) {
  292.             case 0:
  293.                 p->cyc++;    /* 次へ */
  294.                 p->lz = 0.0;    /* 始点が 0.0, 終点が 1.0 */
  295.                 p->vz = 0.0;
  296.                 break;
  297.             case 1:/* 加速度的に離れる */
  298.                 if (p->vz < 0.20)
  299.                     p->vz += 0.10;
  300.                 p->lz += p->vz;
  301.                 p->lx = (18 - 54) * p->lz;    /* 終点-始点 */
  302.                 p->ly = (168 - 143) * p->lz;
  303.                 if (p->lz > 1.0) {
  304.                     p->cyc++;    /* 次へ */
  305.                     p->lz = 0.0;
  306.                     p->lx = 0.0;    /* 今度はここが原点になる */
  307.                     p->ly = 0.0;
  308.                     p->ox += (18 - 54);
  309.                     p->oy += (168 - 143);
  310.                 }
  311.                 break;
  312.             case 2:/* ばね振動 */
  313.                 p->vz -= p->lz * P5_K;
  314.                 /* 摩擦 */
  315.                 if (p->vz > 0)
  316.                     p->vz -= P5_M;
  317.                 else
  318.                     p->vz += P5_M;
  319.                 p->lz += p->vz;
  320.                 p->lx = (18 - 54) * p->lz;
  321.                 p->ly = (168 - 143) * p->lz;
  322.                 if ((fabs (p->vz) < P5_V) && (fabs (p->lz) < P5_L)) {
  323.                     p->cyc++;    /* 次へ */
  324.                     p->lx = 0.0;
  325.                     p->ly = 0.0;
  326.                     p->vx = 0.0;
  327.                     p->vy = 0.0;
  328.                 }
  329.                 break;
  330.             default:
  331.                 break;
  332.             }
  333.             if (f_option_flag)
  334.                 fprintf (fp_parts5, "{%d,%d}, ", (int) (p->lx + p->ox), (int) (p->ly + p->oy));
  335.             DispSp (p, 16, parts5_table);
  336.             break;
  337.  
  338.         case 6:    /* 右翼パーツ */
  339.             switch (p->cyc) {
  340.             case 0:
  341.                 p->cyc++;    /* 次へ */
  342.                 p->lz = 0.0;    /* 始点が 0.0, 終点が 1.0 */
  343.                 p->vz = 0.0;
  344.                 break;
  345.             case 1:/* 加速度的に離れる */
  346.                 if (p->vz < 0.20)
  347.                     p->vz += 0.10;
  348.                 p->lz += p->vz;
  349.                 p->lx = -(18 - 54) * p->lz;    /* 終点-始点 */
  350.                 p->ly = (168 - 143) * p->lz;
  351.                 if (p->lz > 1.0) {
  352.                     p->cyc++;    /* 次へ */
  353.                     p->lz = 0.0;
  354.                     p->lx = 0.0;    /* 今度はここが原点になる */
  355.                     p->ly = 0.0;
  356.                     p->ox -= (18 - 54);
  357.                     p->oy += (168 - 143);
  358.                 }
  359.                 break;
  360.             case 2:/* ばね振動 */
  361.                 p->vz -= p->lz * P5_K;
  362.                 /* 摩擦 */
  363.                 if (p->vz > 0)
  364.                     p->vz -= P5_M;
  365.                 else
  366.                     p->vz += P5_M;
  367.                 p->lz += p->vz;
  368.                 p->lx = -(18 - 54) * p->lz;
  369.                 p->ly = (168 - 143) * p->lz;
  370.                 if ((fabs (p->vz) < P5_V) && (fabs (p->lz) < P5_L)) {
  371.                     p->cyc++;    /* 次へ */
  372.                     p->lx = 0.0;
  373.                     p->ly = 0.0;
  374.                     p->vx = 0.0;
  375.                     p->vy = 0.0;
  376.                 }
  377.                 break;
  378.             default:
  379.                 break;
  380.             }
  381.             if (f_option_flag)
  382.                 fprintf (fp_parts6, "{%d,%d}, ", (int) (p->lx + p->ox), (int) (p->ly + p->oy));
  383.             DispSp (p, 16, parts6_table);
  384.             break;
  385.  
  386.         case 7:    /* 左耳パーツ */
  387.             switch (p->cyc) {
  388.             case 0:
  389.                 p->cyc++;    /* 次へ */
  390.                 p->lz = 0.0;    /* 始点が 0.0, 終点が 1.0 */
  391.                 p->vz = 0.0;
  392.                 break;
  393.             case 1:/* 加速度的に離れる */
  394.                 if (p->vz < 0.20)
  395.                     p->vz += 0.10;
  396.                 p->lz += p->vz;
  397.                 p->lx = (65 - 68) * p->lz;    /* 終点-始点 */
  398.                 p->ly = (115 - 134) * p->lz;
  399.                 if (p->lz > 1.0) {
  400.                     p->cyc++;    /* 次へ */
  401.                     p->lz = 0.0;
  402.                     p->lx = 0.0;    /* 今度はここが原点になる */
  403.                     p->ly = 0.0;
  404.                     p->ox += (65 - 68);
  405.                     p->oy += (115 - 134);
  406.                 }
  407.                 break;
  408.             case 2:/* ばね振動 */
  409.                 p->vz -= p->lz * P7_K;
  410.                 /* 摩擦 */
  411.                 if (p->vz > 0)
  412.                     p->vz -= P7_M;
  413.                 else
  414.                     p->vz += P7_M;
  415.                 p->lz += p->vz;
  416.                 p->lx = (65 - 68) * p->lz;
  417.                 p->ly = (115 - 134) * p->lz;
  418.                 if ((fabs (p->vz) < P7_V) && (fabs (p->lz) < P7_L)) {
  419.                     p->cyc++;    /* 次へ */
  420.                     p->lx = 0.0;
  421.                     p->ly = 0.0;
  422.                     p->vx = 0.0;
  423.                     p->vy = 0.0;
  424.                     end_of_data = !0;    /* debug */
  425.                 }
  426.                 break;
  427.             default:
  428.                 break;
  429.             }
  430.             if (f_option_flag)
  431.                 fprintf (fp_parts7, "{%d,%d}, ", (int) (p->lx + p->ox), (int) (p->ly + p->oy));
  432.             DispSp (p, 9, parts7_table);
  433.             break;
  434.  
  435.         case 8:    /* 右耳パーツ */
  436.             switch (p->cyc) {
  437.             case 0:
  438.                 p->cyc++;    /* 次へ */
  439.                 p->lz = 0.0;    /* 始点が 0.0, 終点が 1.0 */
  440.                 p->vz = 0.0;
  441.                 break;
  442.             case 1:/* 加速度的に離れる */
  443.                 if (p->vz < 0.20)
  444.                     p->vz += 0.10;
  445.                 p->lz += p->vz;
  446.                 p->lx = -(65 - 68) * p->lz;    /* 終点-始点 */
  447.                 p->ly = (115 - 134) * p->lz;
  448.                 if (p->lz > 1.0) {
  449.                     p->cyc++;    /* 次へ */
  450.                     p->lz = 0.0;
  451.                     p->lx = 0.0;    /* 今度はここが原点になる */
  452.                     p->ly = 0.0;
  453.                     p->ox -= (65 - 68);
  454.                     p->oy += (115 - 134);
  455.                 }
  456.                 break;
  457.             case 2:/* ばね振動 */
  458.                 p->vz -= p->lz * P7_K;
  459.                 /* 摩擦 */
  460.                 if (p->vz > 0)
  461.                     p->vz -= P7_M;
  462.                 else
  463.                     p->vz += P7_M;
  464.                 p->lz += p->vz;
  465.                 p->lx = -(65 - 68) * p->lz;
  466.                 p->ly = (115 - 134) * p->lz;
  467.                 if ((fabs (p->vz) < P7_V) && (fabs (p->lz) < P7_L)) {
  468.                     p->cyc++;    /* 次へ */
  469.                     p->lx = 0.0;
  470.                     p->ly = 0.0;
  471.                     p->vx = 0.0;
  472.                     p->vy = 0.0;
  473.                 }
  474.                 break;
  475.             default:
  476.                 break;
  477.             }
  478.             if (f_option_flag)
  479.                 fprintf (fp_parts8, "{%d,%d}, ", (int) (p->lx + p->ox), (int) (p->ly + p->oy));
  480.             DispSp (p, 9, parts8_table);
  481.             break;
  482. #endif
  483.  
  484.         default:
  485.             printf ("enemy_move() : バグってます\n");
  486.             break;
  487.         }
  488.  
  489.         if (erase_flag) {
  490.             if (q == NULL) {    /* リストの一番最初を削除 */
  491.                 enemy_top = p->next;
  492.                 p->next = enemy_null_top;
  493.                 enemy_null_top = p;
  494.                 q = NULL;
  495.                 p = enemy_top;
  496.             } else {
  497.                 q->next = p->next;
  498.                 p->next = enemy_null_top;
  499.                 enemy_null_top = p;
  500.                 p = q->next;
  501.             }
  502.         } else {
  503.             q = p;
  504.             p = p->next;
  505.         }
  506.     }
  507. }
  508.  
  509.  
  510. void EnemyTini (void)
  511. {
  512.     int i;
  513.  
  514.     /* リストをつなげる */
  515.     enemy_top = NULL;
  516.     enemy_null_top = enemy;
  517.     for (i = 0; i < ENEMY_MAX; i++)
  518.         enemy[i].next = &enemy[i + 1];
  519.  
  520.     enemy[ENEMY_MAX - 1].next = NULL;
  521. }
  522.